/**
 * 装饰器 -- 最常用的类装饰器 常用的语法 @Decorators 本身是语法糖
 */

{
	const moveDecorators = (target: Function) => {
		/**
		 * 这里的target实际上就是 使用这个装饰的构造函数
		 */
		target.prototype.getPosition = (): { x: number; y: number } => {
			return { x: 100, y: 200 }
		}
	}

	@moveDecorators
	class Tank {}

	let t1 = new Tank()

	console.log('t1!!!', (t1 as any).getPosition()) // t1!!! { x: 100, y: 200 }

	/**
	 * 装饰器使用 @装饰器名称 时默认的那个target参数 就是要装饰的这个类的构造函数
	 *  所以本质上这种使用方式是一种语法糖的使用方式
	 *  下面写上不是语法糖的写法
	 */

	class Hero {}
	moveDecorators(Hero)
	let h1 = new Hero()
	console.log('h1!!!', (h1 as any).getPosition()) // h1!!! { x: 100, y: 200 }

	/**
	 * 通过对比 可以看到两次的结果一模一样
	 *  这个小节的目的是要理解  使用 @装饰器 的形式本质上就是一种语法糖的写法
	 */
}
